package com.aaa;

class Account {

	//定义一个ThreadLocal类型的变量，该变量讲师一个线程局部变量
	//每个 都会保留该变量的一个副本
	private ThreadLocal<String> name = new ThreadLocal<String>();
	public Account(String str){
		this.name.set(str);
		System.out.println("-----------" + this.name.get());
	}
	public String getName() {
		return name.get();
	}
	public void setName(String str) {
		this.name.set(str);
	}
}
class MyTest extends Thread{
	private Account account;
	public MyTest(Account account,String name){
		super(name);
		this.account = account;
	}
	public void run(){
		for(int i=0; i<10; i++){
			//当i==6时输出将账户名替换成线程名
			if(i== 6){
				account.setName(getName());
			}
			//输出同一个账户的账户名和循环变量
			System.out.println(account.getName() + " 账户的i值：" + i);
		}
	}
}
public class ThreadLocalTest2{
	public static void main(String[] args) {
		//启动两个线程，两个线程共享同一个Account
		Account at = new Account("初始名");
		/*
		  虽然两个线程共享同一个账户，即只有一个账户名
		  但由于账户名是ThreadLocal类型的，所以两个线程将导致有同一个Account
		  但有两个账户名的副本，每个线程都完全拥有各自的账号名副本，
		  所以从i==6只后，讲看到两个线程访问同一个账户是看到不同的账户名
		  */
		new MyTest(at, "线程甲").start();
		new MyTest(at, "线程乙").start();
	}
}

